// 数组迭代函数


/**
 * * 实现 map 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @returns 数组
 */
export function map(arr, callback) {
  let result = [];      // 声明一个空的数组
  // 遍历数组
  for (let i = 0; i < arr.length; i++) {
    // 执行回调
    result.push(callback(arr[i], i));     
  }
  return result;
}


/**
 * * 实现 reduce 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @param {*} initValue 初始值
 * @returns 值
 */
export function reduce(arr, callback, initValue) {
  let result = initValue;   // s声明变量
  // 执行回调
  for (let i = 0; i < arr.length; i++) {
    result = callback(result, arr[i]);
  }
  return result
}


/**
 * * 实现 filter 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @returns 数组
 */
export function filter(arr, callback) {
  // let result = [];     // 声明数组
  // // 遍历数组
  // for (let i = 0; i < arr.length; i++) {
  //   // 执行回调
  //   let res = callback(arr[i], i);
  //   // 判断，如果为真，就添加进 result 数组
  //   if (res) result.push(arr[i]);
  // }
  // return result;
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    let res = callback(arr[i], i)
    if (res) result.push(arr[i])
  }
  return result
}


/**
 * * 实现 find 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @returns 元素
 */
export function find(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    let res = callback(arr[i], i);
    // 如果找到了第一个符合要求的元素，就将整个元素返回
    if (res) {
      return arr[i];
    }
  }
  // 如果找不到，就返回 undefined
  return undefined;
}


/**
 * * 实现 findIndex 函数
 * @param {Array} arr 函数
 * @param {Function} callback 回调函数
 * @returns 元素索引值
 */
export function findIndex(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    let result = callback(arr[i], i);
    // 如果找到了第一个符合要求的元素，就返回当前元素的索引
    if (result) {
      return i;
    }
  }
  // 如果找不到，就返回 -1
  return -1;
}


/**
 * * 实现 every 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @returns Boolean
 */
export function every(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    // 如果有一个元素不满足条件，就返回 false
    if (!callback(arr[i], i)) {
      return false;
    }
  }
  // 否则返回 true
  return true;
}


/**
 * * 实现 some 函数
 * @param {Array} arr 数组
 * @param {Function} callback 回调函数
 * @returns Boolean
 */
export function some(arr, callback) {
  for (let i = 0; i < arr.length; i++) {
    // 只要有一个元素满足条件，就返回 true
    if (callback(arr[i], i)) {
      return true;
    }
  }
  // 否则返回 false
  return false;
}